package br.com.financeiro.controllers;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;

import br.com.financeiro.services.CrudService;
import static br.com.financeiro.helpers.FacesUtils.*;

public abstract class CrudMBean<T> {
	
	protected T obj;
	
	protected DataModel<T> listagem;
	
	protected CrudService<T> service;
	
	public String salvar(){
		service.salvarOuAtualizar(obj);
		addMensagemSucesso("Dados salvos com sucesso.");
		return getDir()+"/list";
	}
	
	public String atualizar(){
		service.salvarOuAtualizar(obj);
		addMensagemSucesso("Dados atualizados com sucesso.");
		return getDir()+"/form";
	}
	
	public String alterar(){
		obj = (T) listagem.getRowData();
		return getDir()+"/form";
	}
	
	public void remover(){
		obj = (T) listagem.getRowData();
		service.remover(obj);
		addMensagemSucesso("Registro removido com sucesso.");
		listagem = null;
	}
	
	public String novo(){
		return getDir()+"/form";
	}
	
	public String voltar(){
		return getDir()+"/list";
	}
	
	public String menu(){
		return "/pages/index";
	}
	
	public DataModel<T> getListagem(){
		listagem = new ListDataModel<T>(service.findAll((Class<T>)obj.getClass()));
		return listagem;
	}
	
	protected UserDetails getUserDetails(){
		Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		UserDetails userDetails = null;
		if (principal instanceof UserDetails){
			userDetails = (UserDetails) principal;
		}
		return userDetails;
	}
	
	public String getLoginUsuario(){
		return getUserDetails().getUsername();
	}
	
	
	
	protected abstract String getDir();

	public T getObj() {
		return obj;
	}

	public void setObj(T obj) {
		this.obj = obj;
	}

	protected void setService(CrudService<T> service) {
		this.service = service;
	}

}
